package com.sun.test;

import org.junit.Test;
import sun.reflect.generics.tree.Tree;

import java.util.Scanner;
import java.util.Vector;

public class PrimeNum {
    public static void main(String[] args) {
        /*
        * 判断1-100之间有多少个素数并输出所有素数
        *程序分析：判断素数的方法：用一个数分别去除2到sqrt(这个数)，如果能被整除， 则表明此数不是素数，反之是素数。
        * */
        /*int x=0;//引入一个计数器
        Vector v = new Vector();//集合,用来装所有的素数
        for(int i=1;i<=100;i++)
        {
            boolean b=true;//标签为b为真
            for(int j=2;j<i;j++)
            {
                if(i%j==0)//求余数是否为0
                {
                    b = false;//如果为0, 将标签设置为false
                    break;  //可以整除就跳出这个循环
                }
            }
            if(b)
            {
                v.add(i);//将符合要求的i加到集合里
                x++; // 素数个数加1
            }
        }
        System.out.println("1到100中间有 "+x+" 个素数");
        System.out.println("素数为:\n"+v);

        //引入一个计数器
        int count=0;
        for (int i = 1; i < 101; i++) {
            if(isPrime(i)){
                System.out.print(i+"\t");
                count++;
                if(count%8==0){
                    System.out.println();
                }
            }
        }
        */

        //3.输入三个班，每班10个学生的成绩，求每个班的总分和平均分
        /*int sum = 0;
        int score=0;
        //创建Scanner对象
        Scanner sc=new Scanner(System.in);
        for (int i = 0; i < 3; i++) {//班级
            System.out.println("第"+(i+1)+"个班：");
            for (int j = 0; j < 10; j++) {//班上学生
                System.out.println("请输入第"+(j+1)+"学生的成绩:");
                score=sc.nextInt();//学生成绩
                System.out.println(score);
                sum+=score;//总成绩
            }
            //求平均分
            int avg=sum/10;
            //输出结果
            System.out.println("第"+(i+1)+"个班学生总分："+sum+",平均分："+avg);
        }*/

        //编写递归算法程序：一列数的规则如下: 1、1、2、3、5、8、13、21、34...... 求数列的第40位数是多少
        //getNumber(40);
        /*
        * 1.打印出所有的"水仙花数"，所谓"水仙花数"是指一个三位数，其各位数字立方和等于该数本身。
        * 例如：153是一个"水仙花数"，因为153=1的三次方＋5的三次方＋3的三次方。
        * */
        /*for (int i = 100; i <1000 ; i++) {
            if (isLotus(i)) {
                System.out.print(i+"\t");
            }
        }
        System.out.println();*/
        //定义方法：打印指定行和列的矩形
       // printStr(5,4,"*");

        /*
        * 3.编写Java程序，实现接收用户输入的正整数，输出该数的阶乘。
        * 要求：限制输入的数据在1-10之间，无效数据进行提示，结束程序。要求使用递归和循环分别实现。
        * 输出结果如：4！=1*2*3*4=24
        * */
        Scanner input = new Scanner(System.in);
        //输入一个数
        System.out.println("请输入你要判断的数据：");
        int n = input.nextInt();
        if(n<0||n>10){
            System.out.println("限制要输入的数据在1-10之间");
            System.exit(0);
        }
        String str=testString(n);
        //long sum=factRec(n);//递归
        //System.out.println(n+"!="+str+"="+sum);
        long sum2=factForever(n);//循环
        System.out.println(n + "!=" + str + "=" + sum2);
    }

    /**
     * 判断一个数是否为素数
     * @param n
     * @return
     */
    public static boolean isPrime(int n){
        boolean flag=true;//返回默认为true,代表是素数
        if(n==1){
             flag=false;
        }else{
            for (int i = 2; i <=Math.sqrt(n); i++) {
                if(n%i==0){
                    flag=false;
                    break;
                }
            }
        }
        return flag;
    }

    /**
     * 斐波那数列
     * @param n
     * @return
     */
    public static int getNumber(int n){
        if(n<0){
            return -1;
        }else if(n==0){
            return 0;
        }else if(n==1||n==2){
            return 1;
        }else {
            return getNumber(n-1)+getNumber(n-2);
        }
    }

    /**
     * 判断水仙花数
     * @param n
     * @return
     */
    public static boolean isLotus(int n){
        //拿来一个开关
        boolean flag=false;
        //分解各位
        int ge=n%10;
        int shi=n/10%10;
        int bai=n/100%10;
        //判断是否为水仙花数
        if(Math.pow(ge,3)+Math.pow(shi,3)+Math.pow(bai,3)==n){
            flag=true;
        }
        return flag;
    }

    /**
     * 打印指定行和列的矩形
     * @param rows 行
     * @param columns 列
     * @param str 用什么符号
     */
    public static void printStr(int rows,int columns,String str){
        for (int i = 0; i < rows; i++) {//行
            for (int j = 0; j < columns; j++) {//列
                System.out.print(str);//符号
            }
            System.out.println();//换行
        }
    }

    /**
     * 实现字符串的输出
     * @param n
     * @return
     */
    public static String testString(int n){
        String result = "";
        for (int i = 1; i <=n; i++) {
            result+=(i+"*");
        }
        return result.substring(0,result.length() - 1);
    }

    /**
     * 递归实现
     * @param n
     * @return
     */
    public static long factRec(int n){
        if(n==1){//递归终止条件
            return 1;//简单情景
        }else {
            return n*factRec(n-1);//相同重复逻辑，缩小问题的规模
        }
    }

    /**
     * for循环实现
     * @param n
     * @return
     */
    public static long factForever(int n){
        int sum=1;
        for (int i = 1; i < n; i++) {
            sum+=sum*i;
        }
        return sum;
    }

    /* x  指定行
     * y  指定列
    * Title: 杨辉三角形又称Pascal三角形，它的第i+1行是(a+b)i的展开式的系数。
            * 它的一个重要性质是：三角形中的每个数字等于它两肩上的数字相加。
            *
            * 例如，下面给出了杨辉三角形的前4行：
            *    1
            *   1 1
            *  1 2 1
            * 1 3 3 1
            * 递归获取杨辉三角指定行、列(从0开始)的值
    注意：与是否创建杨辉三角无关
     */
    int getValue(int x, int y) {
        if(y <= x && y >= 0){            //这里是保证输入x,y是正确的值
            if(y == 0 || x == y){       // 递归终止条件，因为第0列和第(x,y)都是固定值 1
                return 1;
            }else{
                // 递归调用，缩小问题的规模
                return getValue(x-1, y-1) + getValue(x-1, y);
            }
        }
        return -1;
    }

    /*
     *在程序中，我们把最上面的盘子称为第一个盘子，把最下面的盘子称为第N个盘子
     *
     *盘子的个数
     *盘子的初始地址
     *转移盘子时用于中转
     *盘子的目的地址
     */
    public static void moveDish(int level, char from, char inter, char to) {

        if (level == 1) {     // 递归终止条件
            System.out.println("从"+from+" 移动盘子 "+level+"号到 "+to);
        } else {
            /* 递归调用：将level-1个盘子从from移到inter(不是一次性移动，每次只能移动一个盘子,
                其中to用于周转)*/
            moveDish(level - 1, from, to, inter); // 递归调用，缩小问题的规模
            // 将第level个盘子从A座移到C座
            System.out.println("从"+from+"移动盘子"+level+"号到 "+to);
            // 递归调用：将level-1个盘子从inter移到to,from 用于周转
            moveDish(level - 1, inter, from, to); // 递归调用，缩小问题的规模
        }
    }



}
